//
//  Person.m
//  RunTime
//
//  Created by 宜必鑫科技 on 2017/11/8.
//  Copyright © 2017年 宜必鑫科技. All rights reserved.
//

#import "Person.h"


@implementation Person

// 无参数
void eat()
{
    NSLog(@"-----无参数");
}

// 有参数  多个参数 数组返回
void eat1(id self,SEL sel,id obj)
{
    Person *per = (Person *)self;
    NSLog(@"有参数 ----- %@ %@ %@",per.name,NSStringFromSelector(sel),obj);
}

// 当一个对象调用未实现的方法，会调用这个方法处理,并且会把对应的方法列表传过来.
// 刚好可以用来判断，未实现的方法是不是我们想要动态添加的方法
+ (BOOL)resolveInstanceMethod:(SEL)sel
{
//    NSLog(@"---resolveInstanceMethod---%@",NSStringFromSelector(sel));
    if (sel == @selector(eat)) {
        // 动态添加eat方法
        
        // 第一个参数：给哪个类添加方法
        // 第二个参数：添加方法的方法编号
        // 第三个参数：添加方法的函数实现（函数地址）
        // 第四个参数：函数的类型，(返回值+参数类型) v:void   @对象->self   :表示SEL->_cmd
        class_addMethod(self, sel, (IMP)eat, "v");
        
    }else if (sel == @selector(eat1:)){
        class_addMethod(self, sel, (IMP)eat1, "v@:@");
    }
    
    return [super resolveInstanceMethod:sel];
}

@end
